﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using CondominiosSOAP.Persistencia;
using CondominiosSOAP.Dominio;

namespace CondominiosSOAP
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Cuotas" en el código, en svc y en el archivo de configuración a la vez.
    public class Cuotas : ICuotas
    {
        private CuotaDAO cuotaDAO = null;

        private CuotaDAO CuotaDAO
        {
            get
            {
                if (cuotaDAO == null)
                    cuotaDAO = new CuotaDAO();
                return cuotaDAO;
            }
        }

        private ViviendaDAO viviendaDAO = null;

        private ViviendaDAO ViviendaDAO
        {
            get
            {
                if (viviendaDAO == null)
                    viviendaDAO = new ViviendaDAO();
                return viviendaDAO;
            }
        }


        public SCuota CrearCuota(SCuota scuota)
        {
            // Validación de existencia de la vivienda
            //SVivienda vivienda = ViviendaDAO.Obtener(cuota.Vivienda.NumVivienda);
            SVivienda viviendaExistente = ViviendaDAO.Obtener(scuota.Vivienda.NumVivienda);
            if (viviendaExistente == null)
                throw new Exception("Vivienda inexistente");

            // Validación de existencia de una vivienda
            ICollection<SCuota> cuotaExistente = CuotaDAO.obtenerCuotaPorViviendaPeriodo(scuota.Vivienda.NumVivienda, scuota.Anio, scuota.Mes);
            if (cuotaExistente.Count > 0)
                throw new Exception("Ya existe la Cuota");

            //SVivienda viviendaExistente = ViviendaDAO.Obtener(scuota.Vivienda.NumVivienda);
            SCuota cuotaACrear = new SCuota();

            cuotaACrear.IdCuota = scuota.IdCuota;
            cuotaACrear.Mes = scuota.Mes;
            cuotaACrear.Anio = scuota.Anio;
            cuotaACrear.Importe = scuota.Importe;
            cuotaACrear.FechaVencimiento = scuota.FechaVencimiento;
            cuotaACrear.Vivienda = viviendaExistente;
            //cuotaACrear.Estado = scuota.Estado;
            cuotaACrear.Estado = "P";
            
            return CuotaDAO.Crear(cuotaACrear);
        }

        public SCuota ObtenerCuota(int idcuota)
        {
             return CuotaDAO.Obtener(idcuota);
        }

        public SCuota ModificarCuota(SCuota scuota)
        {
            SVivienda viviendaExistente = ViviendaDAO.Obtener(scuota.Vivienda.NumVivienda);
            SCuota cuotaAModificar = new SCuota();
            
            cuotaAModificar.IdCuota = scuota.IdCuota;
            cuotaAModificar.Mes = scuota.Mes;
            cuotaAModificar.Anio = scuota.Anio;
            cuotaAModificar.Importe = scuota.Importe;
            cuotaAModificar.FechaVencimiento = scuota.FechaVencimiento;
            cuotaAModificar.Vivienda = viviendaExistente;
            cuotaAModificar.Estado = scuota.Estado;
            
            return CuotaDAO.Modificar(cuotaAModificar);
        }

        public void EliminarCuota(int idcuota)
        {
            SCuota cuotaExistente = CuotaDAO.Obtener(idcuota);
            CuotaDAO.Eliminar(cuotaExistente);
        }

        public SCuota PagarCuota(int idcuota, string tipoPago)
        {
            SCuota cuota = CuotaDAO.Obtener(idcuota);
            if (cuota == null)
                throw new Exception("La cuota no existe");

            if (cuota.Estado.Equals("C"))
                throw new Exception("La cuota ya se encuentra cancelada");

            STransaccionPago stransaccion = new STransaccionPago();

            stransaccion.Cuota = cuota;
            stransaccion.TipoPago = tipoPago;

            TransaccionesPagos transaccion = new TransaccionesPagos();

            transaccion.CrearTransaccion(stransaccion);

            cuota.Estado = "C";
            cuota = CuotaDAO.Modificar(cuota);
            return cuota;
        }

        public ICollection<SCuota> ListarCuotas()
        {
            return CuotaDAO.ListarTodos();
        }
        
        public ICollection<SCuota> ListarCuotasPendientes(int numVivienda)
        {
            return CuotaDAO.CuotasPendientes(numVivienda);
        }

        public ICollection<SCuota> ListarConsultarMorosos()
        {
            return CuotaDAO.ListarMorosos();
        }

        //public ICollection<SCuota> ListarConsultarMorosos(string cuotaEstado, DateTime cuotaFecha)
        //{
        //    return CuotaDAO.ListarMorosos(cuotaEstado,cuotaFecha);
        //}
    }
}
